package com.wlz.security.session.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 *  1. 获取 用户 信息 (访问  /admin/index)
 *  2. 会话控制
 *      1）always ：      如果session不存在总是需要创建
 *      2）ifRequired：   如果需要就创建一个session（默认）登录时
 *      3）never：        Spring Security 将不会创建session，但是如果应用中其他地方创建了session，那么Spring Security将会使用它
 *      4）stateless：    Spring Security将绝对不会创建session，也不使用session。并且它会暗示不使用
 *             cookie，所以每个请求都需要重新进行身份验证。这种无状态架构适用于REST API
 *              及其无状态认证机制。
 *  3. 会话超时
 *      1）可以在sevlet容器中设置Session的超时时间，如下设置Session有效期为600s； spring boot 配置文件：
 *          server.servlet.session.timeout=60s
 *       2）注意：session最低60s。
 *
 * @author wlz
 */
//@Configuration
public class WebSecurtiyConfig2 extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService myUserDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin();
        http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                .invalidSessionUrl("/session/invalid");  // 配置 session超时之后，跳转的路径

        http.authorizeRequests()
                .antMatchers("/login","/session/invalid").permitAll()
                .anyRequest().authenticated();
        http.csrf().disable();
    }


    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

}
